package org.grottarossa.template.drivers.components;

import org.grottarossa.template.data.pojo.content.Content;
import org.grottarossa.template.data.pojo.content.ContentList;
import org.grottarossa.template.data.pojo.content.Document;
import org.grottarossa.template.data.pojo.content.DocumentList;
import org.grottarossa.template.data.pojo.table.Record;
import org.grottarossa.template.drivers.components.tokens.CaseManagementId;
import org.grottarossa.template.drivers.components.tokens.ContentManagementId;
import org.grottarossa.template.drivers.components.tokens.DocumentManagementId;

import org.grottarossa.template.drivers.DriverException;
/**
*
* La classe rappresenta l'interfaccia di Document Management di AeroFlow. L'interfaccia puo' essere implementata utilizzando qualsiasi tool di case management a patto che le API vengano tutte
* rispettate nella loro implementazione.
*
* @author Marco Sabatini (sabatini.m@gmail.com)
* @author Maurizio Farina (maurizio.farina@gmail.com)
* @author Marco Trischitta (marco.trischitta@gmail.com)
* @version %I%, %G%
* @since 1.0
*
*
* */
public interface DocumentManagement
{
	//get methods
	/**
	 * La funzione recupera tutti i content objects presenti in un determinato casefolder.
	 * @param objectId E' l'id del casefolder da cui si vogliono recuperare i content associati.
	 * @return Un'oggetto di tipo {@link Code ContentList} che rappresenta la lista dei content presenti nel casefolder.
	 *
	 * */
	public ContentList getContentsFromCaseFolder(CaseManagementId objectId) throws DriverException;
	/**
	 * Il metodo recupera un determinato oggetto content dal casefolder.
	 * @param caseId E' l'id del casefolder sul quale cercare l'oggetto content.
	 * @param contentId E' l'id dell'oggetto content che si vuole recuperare.
	 * @return L'oggetto content che e' stato trovato.
	 *
	 * @throws DriverException
	 * */
	public Content getContentFromCaseFolder(CaseManagementId caseId , ContentManagementId contentId) throws DriverException;
	/**
	 * Il metodo recupera il binario di un documento.
	 * @param content E' l'oggetto content di cui si vuole recuperare il binario. Di questo oggetto bisogna inizializzare il casemanagementId e il documentId
	 * @return byte[] E' il byte array del binario.
	 *
	 * */
	public byte[] downloadFile(Content content) throws DriverException;
	/**
	 * @author Marco Sabatini
	 *
	 * @param Content To add: is the content object you want to add to a filestore
	 * @return A string representation of Fully Qualified Id of the Filestore
	 * */
	public Record getContentMetadata(DocumentManagementId documentId) throws DriverException;
	//creation methods
	/**
	 * Il metodo crea un documento nel repository documentale.
	 * @param section E' la section in cui sara' inserito il documento.
	 * @param contentToAdd E' l'oggetto content che deve essere inserito.
	 * @return L'identificavo del documento appena inserito.
	 *
	 * */
	public DocumentManagementId createContent(String section,Content contentToAdd) throws DriverException;
	/**
	 * Il metodo esegue l'upload del binario associato ad un content
	 *
	 * */
	public void uploadFile(DocumentManagementId documentId, byte[] data, String fileName) throws DriverException;
	/**
	 * La funzione viene utilizzata per l'inserimento di un file nel content repository di case360.
	 * @param documentId E' l'id del documento su cui inserire un binario.
	 * @param filePath E' il path del file di cui si vuole si vuole effettuare l'upload
	 * @param fileName E' il nome che si vuole dare al file.
	 *
	 * */
	public void uploadFile(DocumentManagementId documentId,String filePath) throws DriverException;
	/**
	 * La funzione aggiorna i metadati associati ad un determinato documento.
	 * @param documentId
	 * @param metadata
	 * @throws DriverException
	 * */
	public void updateContentMetadata(DocumentManagementId documentId,Record metadata) throws DriverException;
	/**
	 * Il metodo esegue il check-in del documento
	 * */
	public void checkIn(Content content) throws DriverException;
	/**
	 * Il metodo esegue il check-out del documento
	 * */
	public byte[] checkOut(Content content) throws DriverException;
	//managed methods
	/**
	 * Il metodo esegue il lock del documento da parte dell'utente
	 * */
	public void lockDocument(DocumentManagementId id) throws DriverException;
	/**
	 * Il metodo permette di eseguire l'unlock del documento
	 * */
	public void unLockDocument(DocumentManagementId id) throws DriverException;
	/**
	 * Il metodo esegue il remove di un documento
	 * @param docId E' l'id del documento che si vuole eliminare
	 * @param version E' la versione del documento che si vuole eliminare
	 *
	 * */
	public void removeFile(DocumentManagementId docId,int version) throws DriverException;
	/**
	 * Il metodo effettua il fetch di un songolo file dato un oggetto Document
	 * @param content E' il content di cui si vuole effettuare il fetch
	 *
	 * */
	public byte[] fetchFile(Document content) throws DriverException;
	/**
	 * Il metodo recupera la lista delle versioni associate ad un content
	 * @param id E' l'id del documento di cui si vuole recuperare la lista delle versioni
	 * @return DocumentList E' la lista di oggetti document che la piattaforma gestisce come documenti.
	 * */
	public DocumentList getDocumentVersions(DocumentManagementId id) throws DriverException;
}
